解釋 2048 的遊戲目標、滑動與合併規則、終止條件等
2048 是一款單人益智遊戲,玩家透過滑動方格中的數字進行合併,
最終目標是在盤面上生成一個 數字 2048 的方塊。
遊戲盤面為 4x4,每格可以放置一個數字(通常是 2 的冪次)。
遊戲基本迴圈如下:
這是 2048 最重要的邏輯,先用向左滑為例:
| 操作前 | 壓縮非零數字 | 合併相同數字 | 再壓縮 |
|---|---|---|---|
| 2 0 2 4 | 2 2 4 0 | 4 0 4 0 | 4 4 0 0 |
| 4 4 4 4 | 4 4 4 4 | 8 0 8 0 | 8 8 0 0 |
遊戲會在以下情況結束:
盤面上出現數字 2048(或玩家自訂目標,例如 4096)。
盤面已無空格,且 四個方向都無法再合併。
以下是一個簡化的滑動過程示意:
[2][0][2][4] ←滑動左
↓
[2][2][4][0] ←壓縮
↓
[4][0][4][0] ←合併
↓
[4][4][0][0] ←再壓縮
雖然今天我們還沒寫程式,但可以先用 Gemini CLI 當學習輔助,
讓它用多種情境幫我們列舉滑動與合併的範例,
方便實作滑動邏輯時直接用來做測試資料。
gemini -p "請幫我產生 2048 遊戲向左滑動的 10 組測試案例,包含壓縮、合併、再壓縮的過程"
這是在 2048 遊戲中向左滑動(moveLeft)的 10 組測試案例。
每個案例都會展示一個 4x4 的遊戲板,並分解說明「向左滑動」操作的三個核心步驟:
初始狀態 (Before):
[[2, 2, 0, 0],
[4, 4, 2, 0],
[8, 0, 8, 0],
[0, 0, 0, 0]]
過程 (Process):
[2, 2, 0, 0] -> [2, 2, 0, 0] (無變化)[4, 4, 2, 0] -> [4, 4, 2, 0] (無變化)[8, 0, 8, 0] -> [8, 8, 0, 0]
[2, 2, 0, 0] -> [4, 0, 0, 0]
[4, 4, 2, 0] -> [8, 0, 2, 0]
[8, 8, 0, 0] -> [16, 0, 0, 0]
[8, 0, 2, 0] -> [8, 2, 0, 0]
最終狀態 (After):
[[4, 0, 0, 0],
[8, 2, 0, 0],
[16, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 4, 8, 16],
[0, 2, 0, 4],
[0, 0, 8, 0],
[16, 0, 0, 0]]
過程 (Process):
[2, 4, 8, 16] (無變化)[0, 2, 0, 4] -> [2, 4, 0, 0]
[0, 0, 8, 0] -> [8, 0, 0, 0]
[16, 0, 0, 0] (無變化)最終狀態 (After):
[[2, 4, 8, 16],
[2, 4, 0, 0],
[8, 0, 0, 0],
[16, 0, 0, 0]]
初始狀態 (Before):
[[2, 2, 4, 4],
[8, 8, 8, 8],
[0, 0, 0, 0],
[0, 0, 0, 0]]
過程 (Process):
[2, 2, 4, 4] -> [4, 0, 8, 0]
[8, 8, 8, 8] -> [16, 0, 16, 0]
[4, 0, 8, 0] -> [4, 8, 0, 0]
[16, 0, 16, 0] -> [16, 16, 0, 0]
最終狀態 (After):
[[4, 8, 0, 0],
[16, 16, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 2, 2, 0],
[4, 0, 4, 4],
[0, 0, 0, 0],
[0, 0, 0, 0]]
過程 (Process):
[2, 2, 2, 0] (無變化)[4, 0, 4, 4] -> [4, 4, 4, 0]
[2, 2, 2, 0] -> [4, 0, 2, 0]
[4, 4, 4, 0] -> [8, 0, 4, 0]
[4, 0, 2, 0] -> [4, 2, 0, 0]
[8, 0, 4, 0] -> [8, 4, 0, 0]
最終狀態 (After):
[[4, 2, 0, 0],
[8, 4, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 2, 4, 8],
[4, 4, 2, 2],
[2, 4, 2, 4],
[4, 2, 4, 2]]
過程 (Process):
[2, 2, 4, 8] -> [4, 0, 4, 8]
[4, 4, 2, 2] -> [8, 0, 4, 0]
[2, 4, 2, 4] (無合併)[4, 2, 4, 2] (無合併)[4, 0, 4, 8] -> [4, 4, 8, 0]
[8, 0, 4, 0] -> [8, 4, 0, 0]
最終狀態 (After):
[[4, 4, 8, 0],
[8, 4, 0, 0],
[2, 4, 2, 4],
[4, 2, 4, 2]]
初始狀態 (Before):
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
過程 (Process):
最終狀態 (After):
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 0, 2, 0],
[0, 4, 0, 4],
[8, 0, 0, 8],
[0, 16, 16, 0]]
過程 (Process):
[2, 0, 2, 0] -> [2, 2, 0, 0]
[0, 4, 0, 4] -> [4, 4, 0, 0]
[8, 0, 0, 8] -> [8, 8, 0, 0]
[0, 16, 16, 0] -> [16, 16, 0, 0]
[2, 2, 0, 0] -> [4, 0, 0, 0]
[4, 4, 0, 0] -> [8, 0, 0, 0]
[8, 8, 0, 0] -> [16, 0, 0, 0]
[16, 16, 0, 0] -> [32, 0, 0, 0]
最終狀態 (After):
[[4, 0, 0, 0],
[8, 0, 0, 0],
[16, 0, 0, 0],
[32, 0, 0, 0]]
初始狀態 (Before):
[[2, 2, 4, 0],
[0, 4, 2, 2],
[0, 0, 0, 0],
[0, 0, 0, 0]]
過程 (Process):
[2, 2, 4, 0] (無變化)[0, 4, 2, 2] -> [4, 2, 2, 0]
[2, 2, 4, 0] -> [4, 0, 4, 0] (新產生的 4 不會與後面的 4 合併)[4, 2, 2, 0] -> [4, 4, 0, 0]
[4, 0, 4, 0] -> [4, 4, 0, 0]
[4, 4, 0, 0] (無變化)最終狀態 (After):
[[4, 4, 0, 0],
[4, 4, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[0, 0, 0, 2],
[0, 0, 4, 4],
[0, 8, 0, 8],
[0, 0, 0, 0]]
過程 (Process):
[0, 0, 0, 2] -> [2, 0, 0, 0]
[0, 0, 4, 4] -> [4, 4, 0, 0]
[0, 8, 0, 8] -> [8, 8, 0, 0]
[2, 0, 0, 0] (無合併)[4, 4, 0, 0] -> [8, 0, 0, 0]
[8, 8, 0, 0] -> [16, 0, 0, 0]
最終狀態 (After):
[[2, 0, 0, 0],
[8, 0, 0, 0],
[16, 0, 0, 0],
[0, 0, 0, 0]]
初始狀態 (Before):
[[2, 0, 2, 4],
[2, 2, 2, 2],
[4, 4, 8, 8],
[16, 0, 16, 16]]
過程 (Process):
[2, 0, 2, 4] -> [2, 2, 4, 0]
[2, 2, 2, 2] (無變化)[4, 4, 8, 8] (無變化)[16, 0, 16, 16] -> [16, 16, 16, 0]
[2, 2, 4, 0] -> [4, 0, 4, 0]
[2, 2, 2, 2] -> [4, 0, 4, 0]
[4, 4, 8, 8] -> [8, 0, 16, 0]
[16, 16, 16, 0] -> [32, 0, 16, 0]
[4, 0, 4, 0] -> [4, 4, 0, 0]
[4, 0, 4, 0] -> [4, 4, 0, 0]
[8, 0, 16, 0] -> [8, 16, 0, 0]
[32, 0, 16, 0] -> [32, 16, 0, 0]
最終狀態 (After):
[[4, 4, 0, 0],
[4, 4, 0, 0],
[8, 16, 0, 0],
[32, 16, 0, 0]]
今天我們深入了解了 2048 的遊戲目標與核心規則,包括:
接下來的 Day 3,我們將實際用 Golang 實作遊戲的核心資料結構
設計一個 4x4 的二維整數陣列來表示遊戲盤面
並在命令列介面中印出盤面內容,方便後續邏輯開發與測試。